/*
 * Usuario.cpp
 */

#include "models/Usuario.h"
#include <string.h>
#include <iostream>
#include <sstream>

using namespace std;

//Constructors
Usuario::Usuario(): recursosPropios(), recursosColaborador(), notificaciones(){
	this->Edad = 0;
}

Usuario::Usuario(string n): recursosPropios(), recursosColaborador(), notificaciones(){
	this->nickname = n;
	this->Edad = 0;
}

//Sets
void Usuario::setNickname(string nick){
	this->nickname = nick;
}
void Usuario::setSexo(string s){
	this->sexo = s;
}
void Usuario::setFechaNacimiento(DateTime d){
	this->FechaNacimiento = d;
}
void Usuario::setEdad(){
	DateTime d = DateTime();// fecha actual
	double diferencia = d - this->FechaNacimiento;//diferencia de dias = fecha actual - fecha de nacimiento
	int edad = int(diferencia)/360;
	this->Edad=edad;
}

//Gets
string Usuario::getNickname(){
	return this->nickname;
}
string Usuario::getSexo(){
	return this->sexo;
}
DateTime Usuario::getFechaNacimiento(){
	return this->FechaNacimiento;
}
double Usuario::getEdad(){
	return this->Edad;
}

// Compares two strings <case-insensitive>
bool caseInsensitiveStringCompare( const string& str1, const string& str2 ) {
	 int sz = str1.size();
    if (str2.size() != sz)
        return false;
    for (int i = 0; i < sz; ++i)
        if (tolower(str1[i]) != tolower(str2[i]))
            return false;
    return true;

}

//Operations
bool Usuario::noEnUso(string nickname){
	return (this->nickname.compare(nickname));
}


void Usuario::imprimirNombreUsuario(){
	cout << this->nickname;
}
void Usuario::imprimirSexoUsuario(){
	cout << this->sexo;
}
void Usuario::imprimirEdadUsuario(){
	cout << this->Edad;
}
void Usuario::imprimirFechaNacUsuario(){
	cout << this->FechaNacimiento;
}
vector<string*> Usuario::ObtenerInfoRecursosPropios(){// obtiene los nombres de las carpetas del usuario
	vector<string*> v;
	set<Recurso*>::iterator it;
	for (it = this->recursosPropios.begin(); it != this->recursosPropios.end(); it++)
	{
	Recurso * rec = (*it);
	string* linea = NULL;
	linea->append(rec->getNombre());
	v.push_back(linea);
	}
	return v;
}
vector<string*> Usuario::ObtenerInfoRecursosColaborador(string usr){ // obtiene los nombres de las carpetas en las que el usuario colabora
	vector<string*> v;
	set<Carpeta*>::iterator it;
	for (it = this->recursosColaborador.begin();it != this->recursosColaborador.end(); it++)
	{
	Carpeta * carp = (*it);
    string* linea = NULL;
    linea->append(carp->getNombre());
    linea->append(" ");
    DateTime fecha=carp->obtenerFechaColaborada(usr);
    int y=int(fecha.getYear());
    int m=int(fecha.getMonth());
    int d=int(fecha.getDay());
    int h=int(fecha.getHour());
    int mi=int(fecha.getMinute());
    string anio;
    string mes;
    string dia;
    string hora;
    string minuto;
    ostringstream convertY;
    ostringstream convertM;
    ostringstream convertD;
    ostringstream convertH;
    ostringstream convertMI;
    convertY << y;
    anio = convertY.str();
    convertM << m;
    mes = convertM.str();
    convertD << d;
    dia = convertD.str();
    convertH << h;
    hora = convertH.str();
    convertMI << mi;
    minuto = convertMI.str();
    linea->append(anio);
    linea->append("/");
    linea->append(mes);
    linea->append("/");
    linea->append(dia);
    linea->append(" ");
    linea->append(hora);
    linea->append(":");
    linea->append(minuto);
    v.push_back(linea);
	}
	return v;
}

set<Carpeta*> Usuario::getCarpetasColaboradas(){
	return this->recursosColaborador;
}
set<Recurso*> Usuario::getRecursosPropios(){
	return this->recursosPropios;
}

void Usuario::notificar(string accion, string nombreArchivo){

	Notificacion * nueva = new Notificacion();
	(*nueva).setFile(nombreArchivo);
	(*nueva).setTipo(accion);
	(*nueva).setRead(false);
	(*nueva).setDateTime(DateTime());

	this->notificaciones.insert(nueva);
}
